1. Fonctionnement de Java

Fonctionnement de Java

Ce qui a fait la popularité de Java à ses débuts, c'est son slogan "write once, run everywhere".
Sans trop rentrer dans des détails techniques inutiles, Java est un langage qui permet d'écrire des programmes compatibles sur toutes les machines capables d'installer une JVM (Java Virtual Machine).
Quand on écrit un programme, on écrit du code dans un langage lisible par des humains (Java par exemple) mais il s'avère que les ordinateurs ne savent pas lire ce programme dans l'état et sont obligés de passer ce code dans un traducteur pour machine.
Les langages de programmations sont souvent appelés des langages "haut niveau". Il y a des degré d'intensité (Java est plus haut niveau que le C par exemple) mais plus un langage est considéré haut niveau, plus il est difficile de le traduire pour la machine.

Le langage que parlent les machine est appelé langage machine (oui ils sont pas allés chercher loin). Le langage machine c'est grosso-modo le langage natif d'un ordinateur. C'est comparable au fait de dire que l'ordinateur parle en binaire. Plus on se rapproche du langage machine, plus on dit qu'on est "bas niveau", en opposition avec les langages complexes qui sont plus haut niveau.
Le hic, c'est que les ordinateurs peuvent parler un langage machine différents suivant l'architecture de leur processeur (le composant qui fait office de cerveau dans l'ordinateur).
Donc si la traduction transforme notre code en langage machine, celui-ci n'est pas compris par tous les ordinateurs mais seulement par ceux qui partagent la même architecture de processeur.

Conclusion : si on veut que notre programme fonctionne sur tous les ordinateurs, il faut le traduire dans tous les langages machines possibles, et il faut pour cela avoir un exemplaire de toutes les architectures possibles pour le traduire. Autant dire que c'est pas gagné !

Il existe deux grandes méthodes de "traduction" vers le langage machine :

  • l'interprétation
  • la compilation

L'interprétation

L'interpretation consiste à traduire le code en langage machine et l'exécuter immédiatement. Ça signifie que pendant l'exécution du programme, il faudra traduire en langage machine les instructions à la volée au fur et à mesure de sa progression.

Un exemple typique de langage qui fonctionne avec de l'interprétation est Javascript :

Pasted image 20250402135705.png

C'est à dire que pendant l'exécution du programme, l'ordinateur n'est pas concentré qu'à l'exécution mais aussi à sa traduction. Il doit jongler avec les deux tâches ! Ce jonglage constitue un certain coût dans les performances du langage.

La compilation

La compilation consiste à traduire tout le code de notre programme en langage machine avant de l'exécuter. C'est une méthode qui permet de produire des fichiers exécutables binaires. Ces fichiers seront spécifiques à l'architecture de l'ordinateur pour laquelle le programme a été compilé. Ils ont l'avantage d'être très rapide à exécuter.

C'est par exemple le cas du langage C !
Pasted image 20250402135805.png
Ici on voit que la compilation a lieue bien avant l'exécution, donc pendant l'exécution l'ordinateur ne perd plus de temps à traduire. En contrepartie on ne peut pas utiliser l'exécutable produit par le compilateur en langage machine sur tous les ordinateurs !

Mode hybride

Java fonctionne avec un principe hybride entre ces deux concepts.
Puisqu'on ne peut pas compiler vers du langage machine ET être 100% portable sur tous les ordinateurs, on va compiler vers une étape entre deux : quelque chose qui soit plus bas niveau (donc plus facile à manipuler pour la machine) que du Java brut. En effet, souvent, plus un langage est simple à utiliser pour un humain (haut niveau), plus il est compliqué à traduire pour la machine (bas niveau), et inversement ! C'est cette tendance qui est en partie la raison pour laquelle Java a trouvé un entre-deux ! Cet entre-deux est appelé Bytecode.

Voilà à quoi ça ressemble :

Pasted image 20250402141644.png

C'est moins glamour pour nous, mais plus compréhensible pour la machine !

Et maintenant qu'on a ce Bytecode, on peut l'interpréter pendant l'exécution sans prendre trop de temps ! Certes il faut toujours traduire ce bytecode en langage machine, mais c'est beaucoup plus simple que de traduire le Java en langage machine directement !

Ça fait qu'à la fin, on a un schéma qui ressemble à ça :

Pasted image 20250402142717.png

La JVM c'est ce fameux programme qui permet d'interpréter le bytecode. Elle possède énormément de fonctionnalités comme par exemple des algorithmes d'optimisation de code, un compilateur "Just-In-Time" qui lui permet de véritablement compiler les morceaux de code qui sont utilisés très fréquemment. En effet, c'est plus efficace de les compiler une fois et de s'en souvenir que de les réinterpréter des millions de fois ! On pourrait faire un article détaillé sur tout ce qu'elle sait faire mais ce n'est pas le but de ce résumé (qui commence à être long d'ailleurs).

Conclusion

La grande différence entre la compilation et l'interprétation est que l'interprétation se déroule pendant l'exécution du programme. Ça a un grand impact sur les performances puisqu'avant l'exécution de chaque instruction par l'ordinateur, il faut la traduire en langage machine. La compilation a l'avantage de traduire tout le programme d'un coup avant son exécution pour ne plus avoir besoin de le faire pendant l'exécution.
La raison pour laquelle Java utilise un entre-deux est que l'interprétation du bytecode vers le langage machine est beaucoup plus rapide que si on voulait interpréter le langage directement en langage machine. Là le coût en performance serait beaucoup plus important.
Ce bytecode est donc le garant de la portabilité de nos programmes sur toutes les autres machines qui installent une JVM en maintenant un niveau de performances élevé.

Si vous voulez voir ces infos expliquées avec un peu plus de détails, j'ai trouvé ce site qui explique superbement la différence entre l'interprétation et la compilation. Les dessins aident beaucoup et les explications sont bonnes. Je n'ai fait que résumer ce qui y est dit.

Bon, maintenant il nous reste à voir comment on peut faire du Java sur notre ordinateur...
Allons voir ça !